home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / main.c < prev    next >
C/C++ Source or Header  |  1989-04-01  |  27KB  |  1,242 lines

  1. /* Main network program - provides both client and server functions */
  2.  
  3. #define HOSTNAMELEN 32        /* changed from 16 by Bdale 860812 */
  4.  
  5. extern char startup[];    /* File to read startup commands from */
  6.  
  7. #include <stdio.h>
  8. #include "global.h"
  9. #include "config.h"
  10. #include "mbuf.h"
  11. #include "netuser.h"
  12. #include "timer.h"
  13. #include "icmp.h"
  14. #include "iface.h"
  15. #include "ip.h"
  16. #include "tcp.h"
  17. #include "ax25.h"
  18. #include "netrom.h"
  19. #ifdef MAC
  20. #include "MacBinary.h"
  21. #endif
  22. #include "ftp.h"
  23. #include "telnet.h"
  24. #include "remote.h"
  25. #include "session.h"
  26. #include "cmdparse.h"
  27.  
  28. #ifdef    ASY
  29. #include "asy.h"
  30. #include "slip.h"
  31. #endif
  32.  
  33. #ifdef    NRS
  34. #include "nrs.h"
  35. #endif
  36.  
  37. #ifdef UNIX        /* BSD or SYS5 */
  38. #include "unix.h"
  39. #endif
  40.  
  41. #ifdef AMIGA
  42. #include "amiga.h"
  43. #endif
  44.  
  45. #ifdef MAC
  46. #include "mac.h"
  47. #include "mac_fopenw.h"
  48. #include <time.h>
  49. #endif
  50.  
  51. #ifdef MSDOS
  52. #include "asy.h"
  53. #endif
  54.  
  55. #ifdef    TRACE
  56. #include "trace.h"
  57. /* Dummy structure for loopback tracing */
  58. struct interface loopback = { NULLIF, "loopback" };
  59. #endif
  60.  
  61. extern struct interface *ifaces;
  62. extern char version[];
  63. extern struct mbuf *loopq;
  64.  
  65. #ifdef MAC
  66. #define itemdisable    0L        
  67. #define itemenable    1L
  68. #define itemcheck    2L
  69. #define itemuncheck    3L
  70. extern char applroot[],mailqdir[],logname[],applestring[];
  71. extern long timezone;
  72. SysEnvRec *sysenvn;
  73. static int tzoffset=0;
  74. FILE *logwndp;
  75. FILE *trcwndp;
  76. FILE *stdiowndp;
  77. StdWindowRec *stdiowrec;
  78. StdWindowRec *logwrec; 
  79. StdWindowRec *trcwrec; 
  80. StdWindowOptions Macwindop,*Macwndops;
  81. int tcptrcflg = FALSE; 
  82. Point wherestdio;
  83. #endif
  84.  
  85. #ifdef CALLBK
  86. FILE *cbkfp;
  87. FILE *cbklfp;
  88. extern char callbook[],calllog[];
  89. #endif
  90.  
  91. int mode;
  92. FILE *logfp;
  93. char badhost[] = "Unknown host %s\n";
  94. char hostname[HOSTNAMELEN];    
  95. unsigned nsessions = NSESSIONS;
  96. int32 resolve();
  97. int16 lport = 1001;
  98. char prompt[] = "net> ";
  99. char nospace[] = "No space!!\n";    /* Generic malloc fail message */
  100.  
  101.  
  102. #ifndef    MSDOS            /* PC uses F-10 key always */
  103. #ifdef MAC
  104. static char escape = 0x1b;    /* default escape character is "esc" */
  105. #else
  106. static char escape = 0x1d;    /* default escape character is ^] */
  107. #endif
  108. #endif
  109.  
  110. /* Command lookup and branch table */
  111. int go(),doax25(),cmdmode(),doconnect(),dotelnet(),doexit(),doclose(),
  112.     dohostname(),doreset(),dotcp(),dotrace(),doescape(),dohelp(),
  113.     doroute(),doecho(),dolog(),doip(),doetherstat(),
  114. #ifdef MAC
  115.     doarp(),dosession(),doftp(),dostart(),dostop(),doattach(),
  116. #else
  117.     memstat(),doarp(),dosession(),doftp(),dostart(),dostop(),doattach(),
  118. #endif
  119.     dosmtp(),doudp(),doparam(),doeol(),dohapnstat(),
  120. #ifdef MAC
  121.     doegstat(),dodump(),dorecord(),doupload(),dokick(),domode(),
  122. #else
  123.     doegstat(),dodump(),dorecord(),doupload(),dokick(),domode(),doshell(),
  124. #endif
  125.     dodir(),docd(),doatstat(),doping(),doforward(),doremote(),donetrom(),
  126. #ifdef PROXY
  127.     donrstat(), dombox(), dois_es() ;
  128. #else
  129.     donrstat(), dombox() ;
  130. #endif
  131.  
  132. #ifdef _FINGER
  133. int dofinger();
  134. #endif
  135.  
  136. #ifdef MAC
  137. int dotzone();
  138. #endif
  139.  
  140. #ifdef CALLBK
  141. int docallbk();
  142. #endif
  143.  
  144. static struct cmds cmds[] = {
  145.     /* The "go" command must be first */
  146.     "",        go,        0, NULLCHAR,    NULLCHAR,
  147. #ifndef MAC
  148.     "!",        doshell,    0, NULLCHAR,    NULLCHAR,
  149. #endif
  150. #if    (defined(MAC) && defined(APPLETALK))
  151.     "applestat",    doatstat,    0,    NULLCHAR,    NULLCHAR,
  152. #endif
  153. #if    (defined(AX25) || defined(ETHER) || defined(APPLETALK))
  154.     "arp",        doarp,        0, NULLCHAR,    NULLCHAR,
  155. #endif
  156. #ifdef    AX25
  157.     "ax25",        doax25,        0, NULLCHAR,    NULLCHAR,
  158. #endif    
  159.     "attach",    doattach,    2,
  160.         "attach <hardware> <hw specific options>", NULLCHAR,
  161. /* This one is out of alpabetical order to allow abbreviation to "c" */
  162. #ifdef    AX25
  163.     "connect",    doconnect,    3,"connect <interface> <callsign> [digipeaters]",
  164.         NULLCHAR,
  165. #endif
  166. #ifdef CALLBK
  167.     "callbk",    docallbk,    0, NULLCHAR,    NULLCHAR,
  168. #endif
  169. #ifndef UNIX    /* BSD or SYS5 */
  170.     "cd",        docd,        0, NULLCHAR,    NULLCHAR,
  171. #endif
  172.     "close",    doclose,    0, NULLCHAR,    NULLCHAR,
  173.     "disconnect",    doclose,    0, NULLCHAR,    NULLCHAR,
  174.     "dir",        dodir,        0, NULLCHAR,    NULLCHAR,
  175. #ifdef    EAGLE
  176.     "eaglestat",    doegstat,    0, NULLCHAR,    NULLCHAR,
  177. #endif
  178.     "echo",        doecho,        0, NULLCHAR,    "echo [refuse|accept]",
  179.     "eol",        doeol,        0, NULLCHAR,
  180.         "eol options: unix, standard",
  181. #ifndef    MSDOS
  182.     "escape",    doescape,    0, NULLCHAR,    NULLCHAR,   
  183. #endif
  184. #ifdef    PC_EC
  185.     "etherstat",    doetherstat,    0, NULLCHAR,    NULLCHAR,
  186. #endif  PC_EC
  187.     "exit",        doexit,        0, NULLCHAR,    NULLCHAR,
  188. #ifdef _FINGER
  189.     "finger",    dofinger,    0, NULLCHAR, NULLCHAR,
  190. #endif
  191.     "forward",    doforward,    0, NULLCHAR,    NULLCHAR,
  192.     "ftp",        doftp,        2, "ftp <address>",    NULLCHAR,
  193. #ifdef HAPN
  194.     "hapnstat",    dohapnstat,    0, NULLCHAR,    NULLCHAR,
  195. #endif HAPN
  196.     "help",        dohelp,        0, NULLCHAR,    NULLCHAR,
  197.     "hostname",    dohostname,    0, NULLCHAR,    NULLCHAR,
  198.     "kick",        dokick,        0, NULLCHAR,    NULLCHAR,
  199.     "log",        dolog,        0, NULLCHAR,    NULLCHAR,
  200.     "ip",        doip,        0, NULLCHAR,    NULLCHAR,
  201. #ifdef PROXY
  202.     "is_es",    dois_es,    0, NULLCHAR,    NULLCHAR,
  203. #endif
  204. #ifndef MAC
  205.     "memstat",    memstat,    0, NULLCHAR,    NULLCHAR,
  206. #endif
  207. #ifdef    AX25
  208.     "mbox",        dombox,        0, NULLCHAR,    NULLCHAR,
  209.     "mode",        domode,        2, "mode <interface>",    NULLCHAR,
  210. #endif
  211. #ifdef    NETROM
  212.     "netrom",    donetrom,    0, NULLCHAR,    NULLCHAR,
  213. #ifdef    NRS
  214.     "nrstat",    donrstat,    0, NULLCHAR,    NULLCHAR,
  215. #endif
  216. #endif
  217.     "param",    doparam,    2, "param <interface>", NULLCHAR,
  218.     "ping",        doping,        0, NULLCHAR,    NULLCHAR,
  219. #ifndef UNIX /* BSD or SYS5 */
  220.     "pwd",        docd,        0, NULLCHAR,    NULLCHAR,
  221. #endif
  222.     "record",    dorecord,    0, NULLCHAR,    NULLCHAR,
  223.     "remote",    doremote,    4, "remote <address> <port> <command>",
  224.                             NULLCHAR,
  225.     "reset",    doreset,    0, NULLCHAR,    NULLCHAR,
  226.     "route",    doroute,    0, NULLCHAR,    NULLCHAR,
  227.     "session",    dosession,    0, NULLCHAR,    NULLCHAR,
  228. #ifndef MAC
  229.     "shell",    doshell,    0, NULLCHAR,    NULLCHAR,
  230. #endif
  231.     "smtp",        dosmtp,        0, NULLCHAR,    NULLCHAR,
  232. #ifdef    SERVERS
  233.     "start",    dostart,    2, "start <servername>",NULLCHAR,
  234.     "stop",        dostop,        2, "stop <servername>",    NULLCHAR,
  235. #endif
  236.     "tcp",        dotcp,        0, NULLCHAR,    NULLCHAR,
  237.     "telnet",    dotelnet,    2, "telnet <address>",    NULLCHAR,
  238. #ifdef    TRACE
  239.     "trace",    dotrace,    0, NULLCHAR,    NULLCHAR,
  240. #endif
  241. #ifdef    MAC
  242.     "tzone",    dotzone,    0, NULLCHAR,    NULLCHAR,
  243. #endif
  244.     "udp",        doudp,        0, NULLCHAR,    NULLCHAR,
  245.     "upload",    doupload,    0, NULLCHAR,    NULLCHAR,
  246.     "?",        dohelp,        0, NULLCHAR,    NULLCHAR,
  247.     NULLCHAR,    NULLFP,        0,
  248.         "Unknown command; type \"?\" for list",   NULLCHAR, 
  249. };
  250.  
  251. #ifdef    SERVERS
  252. /* "start" and "stop" subcommands */
  253. int dis1(),echo1(),ftp1(),smtp1(),tn1(),rem1();
  254.  
  255. #ifdef _FINGER
  256. int finger1();
  257. #endif
  258.  
  259. static struct cmds startcmds[] = {
  260.     "discard",    dis1,        0, NULLCHAR, NULLCHAR,
  261.     "echo",        echo1,        0, NULLCHAR, NULLCHAR,
  262. #ifdef _FINGER
  263.     "finger",    finger1,    0, NULLCHAR, NULLCHAR,
  264. #endif
  265.     "ftp",        ftp1,        0, NULLCHAR, NULLCHAR,
  266.     "smtp",        smtp1,        0, NULLCHAR, NULLCHAR,
  267.     "telnet",    tn1,        0, NULLCHAR, NULLCHAR,
  268.     "remote",    rem1,        0, NULLCHAR, NULLCHAR,
  269.     NULLCHAR,    NULLFP,        0,
  270. #ifdef _FINGER
  271.         "start options: discard, echo, finger, ftp, smtp, telnet", NULLCHAR,
  272. #else
  273.         "start options: discard, echo, ftp, smtp, telnet", NULLCHAR,
  274. #endif
  275. };
  276. int ftp_stop(),smtp_stop(),echo_stop(),dis_stop(),tn_stop();
  277. int dis0(),echo0(),ftp0(),smtp0(),tn0(),rem0();
  278.  
  279. #ifdef _FINGER
  280. int finger0();
  281. #endif
  282.  
  283. static struct cmds stopcmds[] = {
  284.     "discard",    dis0,        0, NULLCHAR, NULLCHAR,
  285.     "echo",        echo0,        0, NULLCHAR, NULLCHAR,
  286. #ifdef _FINGER
  287.     "finger",    finger0,    0, NULLCHAR, NULLCHAR,
  288. #endif
  289.     "ftp",        ftp0,        0, NULLCHAR, NULLCHAR,
  290.     "smtp",        smtp0,        0, NULLCHAR, NULLCHAR,
  291.     "telnet",    tn0,        0, NULLCHAR, NULLCHAR,
  292.     "remote",    rem0,        0, NULLCHAR, NULLCHAR,
  293.     NULLCHAR,    NULLFP,        0,
  294. #ifdef _FINGER
  295.         "stop options: discard, echo, finger, ftp, smtp, telnet", NULLCHAR,
  296. #else
  297.         "stop options: discard, echo, ftp, smtp, telnet", NULLCHAR,
  298. #endif
  299. };
  300. #endif
  301.  
  302. main(argc,argv)
  303. int argc;
  304. char *argv[];
  305. {
  306.     static char inbuf[BUFSIZ];    /* keep it off the stack */
  307. #ifdef MAC
  308.     int c,e;
  309.     int i,memErrResult;
  310.     void mac_aboutcmd(),MacHelp(),mac_quits(),mac_windows();
  311. #endif
  312.     char *ttybuf,*fgets(),*cp;
  313.     int16 cnt;
  314.     int ttydriv();
  315.     int cmdparse();
  316.     void check_time(),ip_recv();
  317.     FILE *fp;
  318.     struct interface *ifp;
  319.     struct mbuf *bp;
  320.  
  321. #ifdef MAC
  322.     SetApplLimit(((Ptr *)GetApplLimit)-32767);
  323.      MaxApplZone();
  324.     for (i=1;i<=5;i++)             /*allocate some more blocks ($100) of master pointers*/
  325.     {
  326.         memErrResult = MemError();        /*    test for memory manager error*/
  327.         if (memErrResult == noErr)
  328.         {
  329.             MoreMasters();
  330.             memErrResult = MemError();            /*test for memory manager error*/
  331.         }
  332.     }        /*end of 'for'*/
  333.     if (memErrResult != noErr){         /*test if terminated by error*/
  334.         printf("main: Not enough memory to continue.\n");    /*out of memory..*/
  335.         exit(-1);
  336.     }
  337.  
  338.     mac_tools("About KA9Q Internet..");
  339.     menu (applestring,"About KA9Q Internet..",mac_aboutcmd);
  340.     menu (applestring,"Help",MacHelp);
  341.     menu ("File","-",itemdisable);
  342.     menu ("File","Quit/Q",mac_quits);
  343.     menu ("Edit", "Undo", (ProcPtr)itemdisable);
  344.     menu ("Edit", "Cut/X", (ProcPtr)itemdisable);
  345.     menu ("Edit", "Copy/C", (ProcPtr)itemdisable);
  346.     menu ("Edit", "Paste/V", (ProcPtr)itemdisable);
  347.     menu ("Edit", "Clear", (ProcPtr)itemdisable);
  348.     menu ("Windows","Console",itemenable);
  349.     menu ("Windows","Console",mac_windows);
  350.     menu ("Windows","Log",itemdisable);
  351.     menu ("Windows","Log",mac_windows);
  352.     menu ("Windows","Trace",itemdisable);
  353.     menu ("Windows","Trace",mac_windows);
  354.  
  355.     Macwindop.maxrow = 24;            /* Initialize stdio window options */
  356.     Macwindop.maxcol = 80;
  357.     Macwindop.cursor_visible = TRUE;
  358.     Macwindop.echo_state = TRUE;
  359.     Macwindop._tab_width = 4;
  360.     Macwindop.no_pull_front = TRUE;
  361.     Macwindop.no_grow = FALSE;
  362.     Macwindop.no_drag = FALSE;
  363.     Macwindop.no_goaway = TRUE;
  364.     Macwindop.no_scroll = FALSE;
  365.     Macwindop.no_wrap = FALSE;
  366.     Macwndops = &Macwindop;
  367.     wherestdio.h=4; 
  368.     wherestdio.v=_MBARHEIGHT + _TITLEBARHEIGHT + 4;
  369.  
  370.     Stdio_MacInit(true);
  371.     stdiowrec = Get_WindowPtr(stdout);    /* set options on stdio window */
  372.     stdiowrec->opt.no_pull_front = TRUE;
  373.     
  374.     if ( ( e = SysEnvirons(1,sysenvn) ) != 0)    /* Get local environment info */    
  375.     {
  376.         printf("main: could not get the local environment info.\n");
  377.         exit(-1);    
  378.     }
  379. #endif
  380.  
  381.     ioinit();
  382. #ifdef MAC
  383.     _closeall();    /* Make sure all is ok after a crash */
  384. #endif
  385.  
  386. #if    (defined(UNIX) || defined(AMIGA) || defined(MAC))
  387. #else
  388.     chktasker();
  389. #endif
  390. #ifdef    MSDOS
  391.     printf("KA9Q Internet Protocol Package, v%s DS = %x\n",version,
  392.         getds());
  393. #else
  394.     printf("KA9Q Internet Protocol Package, v%s\n",version);
  395. #endif
  396.     printf("Copyright 1988 by Phil Karn, KA9Q\n");
  397. #ifdef NETROM
  398.     printf("NET/ROM Support Copyright 1989 by Dan Frank, W9NK\n") ;
  399. #endif
  400.     sessions = (struct session *)calloc(nsessions,sizeof(struct session));
  401.     if(argc > 1){
  402.         /* Read startup file named on command line */
  403.         fp = fopen(argv[1],"r");
  404.     } else {
  405.         fp = fopen(startup,"r");
  406.     }
  407. #ifdef MAC
  408.     if ( fp == NULLFILE)    /* Check for existence of net.start */    
  409.     {
  410.         printf("main: could not find net.start.\n");
  411.         exit(-1);    
  412.     }
  413. #endif
  414.     if(fp != NULLFILE){
  415.         while(fgets(inbuf,BUFSIZ,fp) != NULLCHAR){
  416.             cmdparse(cmds,inbuf);
  417.         }
  418.         fclose(fp);
  419.     }        
  420. #ifdef MAC
  421.     SelectWindow(stdiowrec);    /* Make console the front window */
  422. #endif
  423.     cmdmode();
  424.  
  425.     /* Main commutator loop */
  426.     for(;;){
  427.         /* Process any keyboard input */
  428. #ifdef MAC
  429.         while  ((c = mac_toolsevents())  != -1){
  430. #else
  431.         while((c = kbread()) != -1){
  432. #endif
  433. #ifdef    MSDOS
  434.             /* c == -2 means the command escape key (F10) */
  435.             if(c == -2){
  436.                 if(mode != CMD_MODE){
  437.                     printf("\n");
  438.                     cmdmode();
  439.                 }
  440.                 continue;
  441.             }
  442. #endif
  443. #ifdef SYS5
  444.             if(c == escape && escape != 0){
  445.                 if(mode != CMD_MODE){
  446.                     printf("\r\n");
  447.                     cmdmode();
  448.                 }
  449.                 continue;
  450.             }
  451. #endif     /* SYS5 */
  452. #ifdef MAC
  453.             if(c == escape && escape != 0){
  454.                 if(mode != CMD_MODE){
  455.                     printf("\n");
  456.                     cmdmode();
  457.                 }
  458.                 continue;
  459.             }
  460. #endif
  461.             if((cnt = ttydriv(c,&ttybuf)) == 0)
  462.                 continue;
  463.             switch(mode){
  464.             case CMD_MODE:
  465.                 (void)cmdparse(cmds,ttybuf);
  466.                 fflush(stdout);
  467.                 break;
  468.             case CONV_MODE:
  469. #ifndef    MSDOS
  470.                 if(ttybuf[0] == escape && escape != 0){
  471.                     printf("\n");
  472.                     cmdmode();
  473.                 } else
  474. #endif MSDOS
  475.                     if(current->parse != NULLFP)
  476.                         (*current->parse)(ttybuf,cnt);
  477.  
  478.                 break;
  479.             }
  480.             if(mode == CMD_MODE){
  481.                 printf(prompt);
  482.                 fflush(stdout);
  483.             }
  484.         }
  485.         /* Service the loopback queue */
  486.         if((bp = dequeue(&loopq)) != NULLBUF){
  487.             struct ip ip;
  488. #ifdef    TRACE
  489.             dump(&loopback,IF_TRACE_IN,TRACE_IP,bp);        
  490. #endif
  491.             /* Extract IP header */
  492.             ntohip(&ip,&bp);
  493.             ip_recv(&ip,bp,0);
  494.         }
  495.         /* Service the interfaces */
  496.         for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next){
  497.             if(ifp->recv != NULLVFP)
  498.                 (*ifp->recv)(ifp);
  499.         }
  500.  
  501.         /* Service the clock if it has ticked */
  502.         check_time();
  503.  
  504. #ifdef    MSDOS
  505.         /* Tell DoubleDos to let the other task run for awhile.
  506.          * If DoubleDos isn't active, this is a no-op
  507.          */
  508.         giveup();
  509. #else
  510.         /* Wait until interrupt, then do it all over again */
  511. #ifndef MAC
  512.         eihalt();
  513. #endif
  514.  
  515. #endif
  516.     }
  517. }
  518. /* Standard commands called from main */
  519.  
  520. /* Enter command mode */
  521. int
  522. cmdmode()
  523. {
  524.     if(mode != CMD_MODE){
  525.         mode = CMD_MODE;
  526.         cooked();
  527.         printf(prompt);
  528.         fflush(stdout);
  529.     }
  530.     return 0;
  531. }
  532. static
  533. doexit(argc,argv)
  534. int argc;
  535. char *argv[];
  536. {
  537.     if(logfp != NULLFILE)
  538.         fclose(logfp);
  539.     iostop();
  540.     exit(0);
  541. }
  542. static
  543. dohostname(argc,argv)
  544. int argc;
  545. char *argv[];
  546. {
  547.     char *strncpy();
  548.  
  549.     if(argc < 2)
  550.         printf("%s\n",hostname);
  551.     else 
  552.         strncpy(hostname,argv[1],HOSTNAMELEN);
  553.     return 0;
  554. }
  555. static
  556. int
  557. dolog(argc,argv)
  558. int argc;
  559. char *argv[];
  560. {
  561.     char *pathname(),*strcpy();
  562.     char *ptr;
  563.     Point wherelog;
  564.     wherelog.h=4; 
  565.     wherelog.v=_MBARHEIGHT + _TITLEBARHEIGHT + 4;
  566.  
  567.     if (argc > 1) {
  568.         if(logfp){                /* close existing log file */
  569.             fclose(logfp);
  570.             logfp = NULLFILE;
  571.         }
  572.         if(logwndp){
  573.             fclose(logwndp);
  574.             menu ("Windows","Log",itemdisable);
  575.             logwndp = NULLFILE;
  576.         }
  577.         if(strcmp(argv[1],"stop") != 0){
  578.             ptr = pathname(logname,argv[1]);
  579.             strcpy(logname,ptr);
  580.             (void)free(ptr);
  581.             logfp = fopen(logname,"a");
  582.             if(logfp == NULLFILE) {
  583.                 printf("Couldn't open log file '%s'.\n",logname);
  584.                 strcpy(logname,applroot);    /* reset initial path */
  585.             }
  586.             logwndp = fopenw("Log",wherelog,Macwndops);
  587.             logwrec = Get_WindowPtr(logwndp);
  588.             menu ("Windows","Log",itemenable);
  589.         }
  590.     }
  591.     
  592.     if(logfp)
  593.         printf("Logging to '%s'.\n",logname);
  594.     else
  595.         printf("Logging off\n");
  596.     return 0;
  597. }
  598. static
  599. int
  600. dohelp(argc,argv)
  601. int argc;
  602. char *argv[];
  603. {
  604. #ifdef MAC
  605.     DoHelp("\p","\pKA9Q Internet Software","\pApple Macintosh Version",
  606.         "\p⌐ Copyright 1988, Phil Karn",TRUE,0L);
  607.     DisposeHelp();
  608. #else
  609.     register struct cmds *cmdp;
  610.     int i,j;
  611.  
  612.     printf("Main commands:\n");
  613.     for(i=0,cmdp = cmds;cmdp->name != NULL;cmdp++,i++){
  614.         printf("%s",cmdp->name);
  615.         if((i % 4) == 3)
  616.             printf("\n");
  617.         else {
  618.             for(j=strlen(cmdp->name);j < 16; j++)
  619.                 putchar(' ');
  620.         }
  621.     }
  622.     if((i % 4) != 0)
  623.         printf("\n");
  624.     return 0;
  625. #endif
  626. }
  627.  
  628. doecho(argc,argv)
  629. int argc;
  630. char *argv[];
  631. {
  632.     extern int refuse_echo;
  633.  
  634.     if(argc < 2){
  635.         if(refuse_echo)
  636.             printf("Refuse\n");
  637.         else
  638.             printf("Accept\n");
  639.     } else {
  640.         if(argv[1][0] == 'r')
  641.             refuse_echo = 1;
  642.         else if(argv[1][0] == 'a')
  643.             refuse_echo = 0;
  644.         else
  645.             return -1;
  646.     }
  647.     return 0;
  648. }
  649. /* set for unix end of line for remote echo mode telnet */
  650. doeol(argc,argv)
  651. int argc;
  652. char *argv[];
  653. {
  654.     extern int unix_line_mode;
  655.  
  656.     if(argc < 2){
  657.         if(unix_line_mode)
  658.             printf("Unix\n");
  659.         else
  660.             printf("Standard\n");
  661.     } else {
  662.         if(strcmp(argv[1],"unix") == 0)
  663.             unix_line_mode = 1;
  664.         else if(strcmp(argv[1],"standard") == 0)
  665.             unix_line_mode = 0;
  666.         else {
  667.             return -1;
  668.         }
  669.     }
  670.     return 0;
  671. }
  672. /* Attach an interface
  673.  * Syntax: attach <hw type> <I/O address> <vector> <mode> <label> <bufsize> [<speed>]
  674.  */
  675. doattach(argc,argv)
  676. int argc;
  677. char *argv[];
  678. {
  679.     extern struct cmds attab[];
  680.  
  681.     return subcmd(attab,argc,argv);
  682. }
  683. /* Manipulate I/O device parameters */
  684. doparam(argc,argv)
  685. int argc;
  686. char *argv[];
  687. {
  688.     register struct interface *ifp;
  689.  
  690.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  691.         if(strcmp(argv[1],ifp->name) == 0)
  692.             break;
  693.     }
  694.     if(ifp == NULLIF){
  695.         printf("Interface \"%s\" unknown\n",argv[1]);
  696.         return 1;
  697.     }
  698.     if(ifp->ioctl == NULLFP){
  699.         printf("Not supported\n");
  700.         return 1;
  701.     }
  702.     /* Pass rest of args to device-specific code */
  703.     return (*ifp->ioctl)(ifp,argc-2,argv+2);
  704. }
  705. /* Log messages of the form
  706.  * Tue Jan 31 00:00:00 1987 44.64.0.7:1003 open FTP
  707.  */
  708. /*VARARGS2*/
  709. log(tcb,fmt,arg1,arg2,arg3,arg4)
  710. struct tcb *tcb;
  711. char *fmt;
  712. #ifdef MAC
  713. char *arg1,*arg2,*arg3,*arg4;    /* everything should come as 32-bit */
  714. #else
  715. int arg1,arg2,arg3,arg4;        /* original non-Mac code */
  716. #endif
  717. {
  718.     char *logtime();
  719.     int fd;
  720.  
  721.     if(logfp == NULLFILE)
  722.         return;
  723.     fprintf(logfp,"%s %s - ",logtime(),psocket(&tcb->conn.remote));
  724.     fprintf(logfp,fmt,arg1,arg2,arg3,arg4);
  725.     fprintf(logfp,"\n");
  726.     fflush(logfp);
  727.     fprintf(logwndp,"%s %s - ",logtime(),psocket(&tcb->conn.remote));
  728.     fprintf(logwndp,fmt,arg1,arg2,arg3,arg4);
  729.     fprintf(logwndp,"\n");
  730. #ifdef    MSDOS
  731.     /* MS-DOS doesn't really flush files until they're closed */
  732.     fd = fileno(logfp);
  733.     if((fd = dup(fd)) != -1)
  734.         close(fd);
  735. #endif
  736. }
  737.  
  738. /* support function for above logging (used elsewhere for console
  739.  * reporting) - returns a character pointer to a time string.
  740. */
  741. char *
  742. logtime()
  743. {
  744.      long t;
  745.      char *cp;
  746.  
  747.      time(&t);            /* get time */
  748.      cp = ctime(&t);      /* turn into a string */
  749.      rip(cp);             /* remove trailing \n, replace with \0 */
  750.      return(cp);          /* return the pointer */
  751. }
  752.  
  753. /* Configuration-dependent code */
  754.  
  755. /* List of supported hardware devices */
  756. int ec_attach(),asy_attach(),pc_attach(),eg_attach(),hapn_attach(),at_attach(),
  757.     nr_attach(),pk_attach();
  758.  
  759. struct cmds attab[] = {
  760. #ifdef    PC_EC
  761.     /* 3-Com Ethernet interface */
  762.     "3c500", ec_attach, 7, 
  763.     "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu>",
  764.     "Could not attach 3c500",
  765. #endif
  766. #ifdef    ASY
  767.     /* Ordinary PC asynchronous adaptor */
  768.     "asy", asy_attach, 8, 
  769.     "attach asy <address> <vector> slip|ax25|nrs <label> <buffers> <mtu> <speed>",
  770.     "Could not attach asy",
  771. #endif
  772. #ifdef    PC100
  773.     /* PACCOMM PC-100 8530 HDLC adaptor */
  774.     "pc100", pc_attach, 8, 
  775.     "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  776.     "Could not attach pc100",
  777. #endif
  778. #ifdef    EAGLE
  779.     /* EAGLE RS-232C 8530 HDLC adaptor */
  780.     "eagle", eg_attach, 8,
  781.     "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed>",
  782.     "Could not attach eagle",
  783. #endif
  784. #ifdef    HAPN
  785.     /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  786.     "hapn", hapn_attach, 8,
  787.     "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full",
  788.     "Could not attach hapn",
  789. #endif
  790. #ifdef    APPLETALK
  791.     /* Macintosh AppleTalk */
  792.     "appletalk", at_attach, 7,
  793.     "attach appletalk <protocol type> <device> arpa <label> <rx bufsize> <mtu>",
  794.     "Could not attach Appletalk",
  795. #endif
  796. #ifdef NETROM
  797.     /* fake netrom interface */
  798.     "netrom", nr_attach, 1,
  799.     "attach netrom",
  800.     "Could not attach netrom",
  801. #endif
  802. #ifdef    PACKET
  803.     /* FTP Software's packet driver spec */
  804.     "packet", pk_attach, 4,
  805.     "attach packet <int#> <label> <buffers> <mtu>",
  806.     "Could not attach packet driver",
  807. #endif
  808.     NULLCHAR, NULLFP, 0,
  809.     "Unknown device",
  810.     NULLCHAR,
  811. };
  812.  
  813. /* Protocol tracing function pointers */
  814. #ifdef    TRACE
  815. int ax25_dump(),ether_dump(),ip_dump(),at_dump();
  816.  
  817. int (*tracef[])() = {
  818. #ifdef    AX25
  819.     ax25_dump,
  820. #else
  821.     NULLFP,
  822. #endif
  823.  
  824. #ifdef    ETHER
  825.     ether_dump,
  826. #else
  827.     NULLFP,
  828. #endif
  829.     ip_dump,
  830.  
  831. #ifdef    APPLETALK
  832.     at_dump,
  833. #else
  834.     NULLFP,
  835. #endif
  836. };
  837. #else
  838. int (*tracef[])() = { NULLFP };    /* No tracing at all */
  839. dump(interface,direction,type,bp)
  840. struct interface *interface;
  841. int direction;
  842. unsigned type;
  843. struct mbuf *bp;
  844. {
  845. }
  846. #endif
  847.  
  848. #ifdef    ASY
  849.  
  850. /* Attach a serial interface to the system
  851.  * argv[0]: hardware type, must be "asy"
  852.  * argv[1]: I/O address, e.g., "0x3f8"
  853.  * argv[2]: vector, e.g., "4"
  854.  * argv[3]: mode, may be:
  855.  *        "slip" (point-to-point SLIP)
  856.  *        "ax25" (AX.25 frame format in SLIP for raw TNC)
  857.  *        "nrs" (NET/ROM format serial protocol)
  858.  * argv[4]: interface label, e.g., "sl0"
  859.  * argv[5]: receiver ring buffer size in bytes
  860.  * argv[6]: maximum transmission unit, bytes
  861.  * argv[7]: interface speed, e.g, "9600"
  862.  * argv[8]: optional ax.25 callsign (NRS only)
  863.  */
  864. int
  865. asy_attach(argc,argv)
  866. int argc;
  867. char *argv[];
  868. {
  869.     register struct interface *if_asy;
  870.     extern struct interface *ifaces;
  871.     int16 dev;
  872.     int mode;
  873.     int asy_init();
  874.     int asy_send();
  875.     int asy_ioctl();
  876.     void doslip();
  877.     int asy_stop();
  878.     int ax_send();
  879.     int ax_output();
  880.     void kiss_recv();
  881.     int kiss_raw();
  882.     int kiss_ioctl();
  883.     int slip_send();
  884.     void slip_recv();
  885.     int slip_raw();
  886.     struct ax25_addr addr ;
  887.     int ax_send(),ax_output(),nrs_raw(),asy_ioctl();
  888.     void nrs_recv();
  889.  
  890.     if(nasy >= ASY_MAX){
  891.         printf("Too many asynch controllers\n");
  892.         return -1;
  893.     }
  894.     if(strcmp(argv[3],"slip") == 0)
  895.         mode = SLIP_MODE;
  896.     else if(strcmp(argv[3],"ax25") == 0)
  897.         mode = AX25_MODE;
  898.     else if(strcmp(argv[3],"nrs") == 0)
  899.         mode = NRS_MODE;
  900.     else 
  901.         mode = UNKNOWN;
  902.  
  903.     dev = nasy++;
  904.  
  905.     /* Create interface structure and fill in details */
  906.     if_asy = (struct interface *)calloc(1,sizeof(struct interface));
  907.     if_asy->name = malloc((unsigned)strlen(argv[4])+1);
  908.     strcpy(if_asy->name,argv[4]);
  909.     if_asy->mtu = atoi(argv[6]);
  910.     if_asy->dev = dev;
  911.     if_asy->recv = doslip;
  912.     if_asy->stop = asy_stop;
  913.  
  914.     switch(mode){
  915. #ifdef    SLIP
  916.     case SLIP_MODE:
  917.         if_asy->ioctl = asy_ioctl;
  918.         if_asy->send = slip_send;
  919.         if_asy->output = NULLFP;    /* ARP isn't used */
  920.         if_asy->raw = slip_raw;
  921.         if_asy->flags = 0;
  922.         slip[dev].recv = slip_recv;
  923.         break;
  924. #endif
  925. #ifdef    AX25
  926.     case AX25_MODE:  /* Set up a SLIP link to use AX.25 */
  927.         axarp();
  928.         if(mycall.call[0] == '\0'){
  929.             printf("set mycall first\n");
  930.             free(if_asy->name);
  931.             free((char *)if_asy);
  932.             nasy--;
  933.             return -1;
  934.         }
  935.         if_asy->ioctl = kiss_ioctl;
  936.         if_asy->send = ax_send;
  937.         if_asy->output = ax_output;
  938.         if_asy->raw = kiss_raw;
  939.         if(if_asy->hwaddr == NULLCHAR)
  940.             if_asy->hwaddr = malloc(sizeof(mycall));
  941.         memcpy(if_asy->hwaddr,(char *)&mycall,sizeof(mycall));
  942.         slip[dev].recv = kiss_recv;
  943.         break;
  944. #endif
  945. #ifdef    NRS
  946.     case NRS_MODE: /* Set up a net/rom serial interface */
  947.         if(argc < 9){
  948.             /* no call supplied? */
  949.             if(mycall.call[0] == '\0'){
  950.                 /* try to use default */
  951.                 printf("set mycall first or specify in attach statement\n");
  952.                 return -1;
  953.             } else
  954.                 addr = mycall;
  955.         } else {
  956.             /* callsign supplied on attach line */
  957.             if(setcall(&addr,argv[8]) == -1){
  958.                 printf ("bad callsign on attach line\n");
  959.                 free(if_asy->name);
  960.                 free((char *)if_asy);
  961.                 nasy--;
  962.                 return -1;
  963.             }
  964.         }
  965.         if_asy->recv = nrs_recv;
  966.         if_asy->ioctl = asy_ioctl;
  967.         if_asy->send = ax_send;
  968.         if_asy->output = ax_output;
  969.         if_asy->raw = nrs_raw;
  970.         if(if_asy->hwaddr == NULLCHAR)
  971.             if_asy->hwaddr = malloc(sizeof(addr));
  972.         memcpy(if_asy->hwaddr,(char *)&addr,sizeof(addr));
  973.         nrs[dev].iface = if_asy;
  974.         break;
  975. #endif
  976.     default:
  977.         printf("Mode %s unknown for interface %s\n",
  978.             argv[3],argv[4]);
  979.         free(if_asy->name);
  980.         free((char *)if_asy);
  981.         nasy--;
  982.         return -1;
  983.     }
  984.     if_asy->next = ifaces;
  985.     ifaces = if_asy;
  986.     asy_init(dev,argv[1],argv[2],(unsigned)atoi(argv[5]));
  987.     asy_speed(dev,atoi(argv[7]));
  988.     return 0;
  989. }
  990. #endif
  991. #ifndef    NETROM
  992. #ifdef    AX25
  993. struct ax25_addr nr_nodebc;
  994. #endif
  995. nr_route(bp)
  996. struct mbuf *bp;
  997. {
  998.     free_p(bp);
  999. }
  1000. nr_nodercv(bp)
  1001. {
  1002.     free_p(bp);
  1003. }
  1004. #endif
  1005.  
  1006.  
  1007. /* Display or set IP interface control flags */
  1008. domode(argc,argv)
  1009. int argc;
  1010. char *argv[];
  1011. {
  1012.     register struct interface *ifp;
  1013.  
  1014.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  1015.         if(strcmp(argv[1],ifp->name) == 0)
  1016.             break;
  1017.     }
  1018.     if(ifp == NULLIF){
  1019.         printf("Interface \"%s\" unknown\n",argv[1]);
  1020.         return 1;
  1021.     }
  1022.     if(argc < 3){
  1023.         printf("%s: %s\n",ifp->name,
  1024.          (ifp->flags & CONNECT_MODE) ? "VC mode" : "Datagram mode");
  1025.         return 0;
  1026.     }
  1027.     switch(argv[2][0]){
  1028.     case 'v':
  1029.     case 'c':
  1030.     case 'V':
  1031.     case 'C':
  1032.         ifp->flags = CONNECT_MODE;
  1033.         break;
  1034.     case 'd':
  1035.     case 'D':
  1036.         ifp->flags = DATAGRAM_MODE;
  1037.         break;
  1038.     default:
  1039.         printf("Usage: %s [vc | datagram]\n",argv[0]);
  1040.         return 1;
  1041.     }
  1042.     return 0;
  1043. }
  1044.  
  1045. #ifdef SERVERS
  1046. dostart(argc,argv)
  1047. int argc;
  1048. char *argv[];
  1049. {
  1050.     return subcmd(startcmds,argc,argv);
  1051. }
  1052. dostop(argc,argv)
  1053. int argc;
  1054. char *argv[];
  1055. {
  1056.     return subcmd(stopcmds,argc,argv);
  1057. }
  1058. #endif SERVERS
  1059.  
  1060. #ifdef    TRACE
  1061. static
  1062. int
  1063. dotrace(argc,argv)
  1064. int argc;
  1065. char *argv[];
  1066. {
  1067.     struct interface *ifp;
  1068.  
  1069.     if(argc < 2){
  1070.         showtrace(&loopback);
  1071.         for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next)
  1072.             showtrace(ifp);
  1073.         return 0;
  1074.     }
  1075.     if(strcmp("loopback",argv[1]) == 0)
  1076.         ifp = &loopback;
  1077.     else 
  1078.         for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next)
  1079.             if(strcmp(ifp->name,argv[1]) == 0)
  1080.                 break;
  1081.  
  1082.     if(ifp == NULLIF){
  1083.         printf("Interface %s unknown\n",argv[1]);
  1084.         return 1;
  1085.     }
  1086.     if(argc >= 3)
  1087.         ifp->trace = htoi(argv[2]);
  1088. #ifdef MAC
  1089.     if(ifp->trace == 0) {
  1090.         tcptrcflg = FALSE;
  1091.         menu ("Windows","Trace",itemdisable);
  1092.         fclose(trcwndp);
  1093.     }
  1094.     else {
  1095.         tcptrcflg = TRUE;
  1096.         menu ("Windows","Trace",itemenable);
  1097.         trcwndp = fopenw("Trace",wherestdio,Macwndops);
  1098.         trcwrec = Get_WindowPtr(trcwndp);
  1099.     }
  1100. #endif
  1101.     showtrace(ifp);
  1102.     return 0;
  1103. }
  1104. /* Display the trace flags for a particular interface */
  1105. static
  1106. showtrace(ifp)
  1107. register struct interface *ifp;
  1108. {
  1109.     if(ifp == NULLIF)
  1110.         return;
  1111.     printf("%s:",ifp->name);
  1112.     if(ifp->trace & (IF_TRACE_IN | IF_TRACE_OUT)){
  1113.         if(ifp->trace & IF_TRACE_IN)
  1114.             printf(" input");
  1115.         if(ifp->trace & IF_TRACE_OUT)
  1116.             printf(" output");
  1117.  
  1118.         if(ifp->trace & IF_TRACE_HEX)
  1119.             printf(" (Hex/ASCII dump)");
  1120.         else if(ifp->trace & IF_TRACE_ASCII)
  1121.             printf(" (ASCII dump)");
  1122.         else
  1123.             printf(" (headers only)");
  1124.         printf("\n");
  1125.     } else
  1126.         printf(" tracing off\n");
  1127.     fflush(stdout);
  1128. }
  1129. #endif
  1130.  
  1131. #ifndef    MSDOS
  1132. static
  1133. int
  1134. doescape(argc,argv)
  1135. int argc;
  1136. char *argv[];
  1137. {
  1138.     if(argc < 2)
  1139.         printf("0x%x\n",escape);
  1140.     else 
  1141.         escape = *argv[1];
  1142.     return 0;
  1143. }
  1144. #endif    MSDOS
  1145. static
  1146. doremote(argc,argv)
  1147. int argc;
  1148. char *argv[];
  1149. {
  1150.     struct socket fsock,lsock;
  1151.     struct mbuf *bp;
  1152.  
  1153.     lsock.address = ip_addr;
  1154.     fsock.address = resolve(argv[1]);
  1155.     lsock.port = fsock.port = atoi(argv[2]);
  1156.     bp = alloc_mbuf(1);
  1157.     if(strcmp(argv[3],"reset") == 0){
  1158.         *bp->data = SYS_RESET;
  1159.     } else if(strcmp(argv[3],"exit") == 0){
  1160.         *bp->data = SYS_EXIT;
  1161.     } else {
  1162.         printf("Unknown command %s\n",argv[3]);
  1163.         return 1;
  1164.     }
  1165.     bp->cnt = 1;
  1166.     send_udp(&lsock,&fsock,0,0,bp,0,0,0);
  1167.     return 0;
  1168. }
  1169. #ifdef MAC
  1170. static
  1171. dotzone(argc,argv)
  1172. int argc;
  1173. char *argv[];
  1174. {
  1175.     char *strncpy();
  1176.  
  1177.     if(argc < 2)
  1178.         printf("Time Zone = %s Offset = %d\n",tzname[1],tzoffset);
  1179.     else { 
  1180.         strncpy(tzname[0],argv[1],3);
  1181.         strncpy(tzname[1],argv[1],3);
  1182.         tzoffset = atoi(argv[2]);
  1183.         timezone = (tzoffset * 3600);
  1184.     }
  1185.     return 0;
  1186. }
  1187. #endif
  1188. #ifdef CALLBK
  1189. static
  1190. int
  1191. docallbk(argc,argv)
  1192. int argc;
  1193. char *argv[];
  1194. {
  1195.     char *pathname(),*strcpy();
  1196.     char *ptr;
  1197.  
  1198.     if (argc > 1) {
  1199.         ptr = pathname(applroot,argv[1]);
  1200.         strcpy(callbook,ptr);
  1201.         (void)free(ptr);
  1202.         cbkfp = fopen(callbook,"r");
  1203.         if(cbkfp == NULLFILE) {
  1204.             printf("Callbook Server: Unable to open Callbook Server Database: '%s'.\n",callbook);
  1205.             printf("Callbook Server: Not available.\n");
  1206.             strcpy(callbook,applroot);    /* reset initial path */
  1207.             return 0;
  1208.         }
  1209.         if(argv[2] == NULLCHAR) {
  1210.             printf("Callbook Server: Log not enabled.\n");
  1211.             cbklfp = NULLFILE;
  1212.             goto docalln;
  1213.         }
  1214.         ptr = pathname(applroot,argv[2]);
  1215.         strcpy(calllog,ptr);
  1216.         (void)free(ptr);
  1217.         cbklfp = fopen(calllog,"a");
  1218.         if(cbklfp == NULLFILE) {
  1219.             printf("Callbook Server: Unable to open Callbook Server Log: '%s'.\n",callbook);
  1220.             printf("Callbook Server: Logging not available.\n");
  1221.             strcpy(calllog,applroot);    /* reset initial path */
  1222.             return 0;
  1223.         }
  1224.     }
  1225.     
  1226. docalln:    
  1227.     if((cbkfp != NULLFILE) && (cbklfp != NULLFILE)) {
  1228.         printf("Callbook Server: Database = '%s'.\n\t\t\t\t Log = '%s'.\n",
  1229.                callbook,calllog);
  1230.         return 0;
  1231.     }
  1232.     if(cbkfp != NULLFILE) {
  1233.         printf("Callbook Server: Database = '%s'\n",callbook);
  1234.         return 0;
  1235.     }
  1236.     else {
  1237.         printf("Callbook Server: Not available.\n");
  1238.         return 0;
  1239.     }
  1240. }
  1241. #endif
  1242.